<?php
/****************************************************************
* MAGPHP Micro Framework										*
* Author by mag796fd											*
* MAIL: mag@magphp.com											*
* Website: http://www.magphp.com								*
****************************************************************/



/****************************************************************
* Page分页类													*
* Website: http://www.magphp.com								*
****************************************************************/
class page{

	private $total;		//数据表中总记录数
	private $listRows;	//每页显示行数
	private $limit;   	 //SQL语句使用limit从名
	private $uri;		//url地址
	private $count;		//页数
	private $p;			//当前页数
	private $paramARR;	//URL中其他参数
	//private $params = array();	//分页跳转时要带的参数

	//在分页信息中显示内容，可以自己设置
	public $config=array(
				'head'=>"条记录", 
				"prev"=>"上一页", 
				"next"=>"下一页", 
				"first"=>"首页", 
				"last"=>"末页"
			);
	public $listNum=7; //默认分页显示的个数 << < 1 2 3 4 5 6 7 > >>


	// 构造方法，可以设置分页类的属性
	// @param	int		$total		计算分页的总记录数
	// @param	int		$listRows	可选的，默认每页需要显示的记录数
	// @param 	array 	$paramARR	可选的，URL中出了控制器、方法、页码以外的其他参数。
	public function __construct($total, $listRows=15, $paramARR=array())
	{
		//URL其他参数
		if(count($paramARR)>0)
		{
			$this->paramARR = $paramARR;
		}
		else
		{
			$this->paramARR = array();
		}
		
		$this->total=$total; //设置总数
		$this->listRows=$listRows; //设置每页行数
		$this->uri=$this->getUri(); //组装URL

		if($this->listRows)
		{
			$this->count=ceil($this->total/$this->listRows); //计算可分多少页
		}
		else
		{
			$this->count=0;
		}
		
		if(!empty($_GET["p"]))
		{
			$p_tmp=floor($_GET["p"]); //获取URL中当前页数
		}
		else
		{
			$p_tmp=1; //如没URL无p参数，让其指向第1页
		}

		//设置当前页码
		if( $this->total>0 && $p_tmp>0 )  //如果有总数，且p参数为int类型
		{
			if($p_tmp >= $this->count)
			{
				$this->p = $this->count; //如果URL的p参数大于最大分页，则p=最大页
			}
			else
			{
				$this->p = $p_tmp; //设置当前页数
			}
		}
		else
		{
			$this->p = 0; //没有数据时就是0页
		}

		$this->uri = $this->getUri();

		$this->limit=$this->setLimit(); //SQL的limit参数集(例：0,10)


	}


	//返回SQL的limit参数集合
	public function setLimit()
	{
		if($this->p > 0)
		{
			$limitNum1 = ($this->p-1) * $this->listRows;
			$limitNum2 = $this->listRows;
			$limitARR = array($limitNum1, $limitNum2);
			return ($limitARR);
		}
		else
		{
			return 0;
		}
	}


	//显示翻页代码
	public function show()
	{
		return $this->startCodes() . $this->numCodes() . $this->endCodes();
	}


	//创建 数字翻页代码
	public function numCodes()
	{
		$newCodes = '';

		//取得显示页码数量的一半值
		$ban1 = floor($this->listNum / 2);
		$ban2 = $ban1;

		//如果现实页数为偶数，则前当前页前面少显示1页
		if(is_int($this->listNum / 2))
		{
			$ban1 -= 1;
		}

		//如果后面不够页数，前面就应该补齐
		if($this->p > ($this->count - $ban2))
		{
			$ban1 += $this->p - ($this->count - $ban2);
		}
		//如果前面不够页数，后面就应该补齐
		if(($this->p - $ban1) <= 0)
		{
			$ban2 += $ban1 - $this->p + 1;
		}
		
		//生成前面的页码
		for($i=$ban1; $i>=1; $i--)
		{
			$isp = $this->p - $i;
			if($isp >= 1)
			{
				if(URLTYPE())
				{
					$newCodes .= '<a class="page-num" href="'.$this->uri.'/p/'.$isp.'">'.$isp.'</a>';
				}
				else
				{
					$newCodes .= '<a class="page-num" href="'.$this->uri.'&p='.$isp.'">'.$isp.'</a>';
				}
			}
		}

		//生成当前页码
		if($this->p >= 1 && $this->count>1)
		{
			$newCodes .= '<span class="page-isnum">'.$this->p.'</span>';
		}

		//生成后面的页码
		for($i=1; $i <= $ban2; $i++)
		{
			$isp = $this->p + $i;
			if($isp <= $this->count)
			{
				if(URLTYPE())
				{
					$newCodes .= '<a class="page-num" href="'.$this->uri.'/p/'.$isp.'">'.$isp.'</a>';
				}
				else
				{
					$newCodes .= '<a class="page-num" href="'.$this->uri.'&p='.$isp.'">'.$isp.'</a>';
				}
			}
			else
			{
				break;
			}
		}
		return $newCodes;
	}

	//创建 首页、上一页
	public function startCodes()
	{
		$newCodes = '';

		if($this->total > 0 && $this->p > 1)
		{
			if(URLTYPE())
			{
				$newCodes .= '<a class="page-first" href="'.$this->uri.'/p/1">&lt;'.$this->config['first'].'</a>'; //首页
			}
			else
			{
				$newCodes .= '<a class="page-first" href="'.$this->uri.'&p=1">&lt;'.$this->config['first'].'</a>'; //首页
			}

			$prevNum = $this->p - 1;
			if($this->p >= 1)
			{
				if(URLTYPE())
				{
					$newCodes .= '<a class="page-prev" href="'.$this->uri.'/p/'.$prevNum.'">&lt;'.$this->config['prev'].'</a>'; //上一页
				}
				else
				{
					$newCodes .= '<a class="page-prev" href="'.$this->uri.'&p='.$prevNum.'">&lt;'.$this->config['prev'].'</a>'; //上一页
				}
			}
		}
		return $newCodes;
	}

	//创建 末页、下一页
	public function endCodes()
	{
		$newCodes = '';

		if($this->total > 0 && $this->p < $this->count)
		{
			$nextNum = $this->p + 1;
			if($this->p < $this->count)
			{
				if(URLTYPE())
				{
					$newCodes .= '<a class="page-next" href="'.$this->uri.'/p/'.$nextNum.'">'.$this->config['next'].'&gt;</a>'; //下一页
				}
				else
				{
					$newCodes .= '<a class="page-next" href="'.$this->uri.'&p='.$nextNum.'">'.$this->config['next'].'&gt;</a>'; //下一页
				}
			}

			if(URLTYPE())
			{
				$newCodes .= '<a class="page-last" href="'.$this->uri.'/p/'.$this->count.'">'.$this->config['last'].'&gt;</a>'; //末页
			}
			else
			{
				$newCodes .= '<a class="page-last" href="'.$this->uri.'&p='.$this->count.'">'.$this->config['last'].'&gt;</a>'; //末页
			}
		}
		return $newCodes;
	}



	//连接符号类型
	public function andlink()
	{
		if(C == 'Index' && A == 'index')
		{
			$andlink = '';
		}
		else
		{
			$andlink = '&';
		}
		return $andlink;
	}


	//获得当前网址信息
	public function getUri()
	{
		//$newUrl = '/'.APPNAME.'.php?c='.C.'&a='.A;
		$newUrl = '';


		//应用、控制器和方法判断
		if(URLTYPE())
		{
			if(count($this->paramARR)>0) //是否存在其他参数
			{
				$newUrl = APPINDEX.'/'.C.'/'.A;
				foreach ($this->paramARR as $key => $val) {
					$newUrl .= '/'.$key.'/'.$val;
				}
			}
			else
			{
				$newUrl = APPINDEX.'/'.C.'/'.A;
			}
		}
		else
		{
			if(count($this->paramARR)>0) //是否存在其他参数
			{
				$newUrl = APPINDEX.'?c='.C.'&a='.A;
				foreach ($this->paramARR as $key => $val) {
					$newUrl .= '&'.$key.'='.$val;
				}
			}
			else
			{
				$newUrl = APPINDEX.'?c='.C.'&a='.A;
			}
		}

		return $newUrl;
	}

	//获得limit值得方法
	public function limit()
	{
		return $this->limit;
	}

	//获得count值
	public function count()
	{
		return $this->count;
	}

	//获得p值
	public function p()
	{
		return $this->p;
	}

	//获得分页统计代码：共xx页/第x页
	public function getPageInfo()
	{
		if($this->total > 0)
		{
			return '共'.$this->total.'条 - 页码'.$this->p.'/'.$this->count;
		}
	}
}



/****************************************************************
* FileCache文件缓存类											*
* Website: http://www.magphp.com								*
****************************************************************/
class fcache{
	public $cache_dir = './cache'; //缓存文件保存目录


	//============================================
	//目录是否存在，不存在则创建
	//============================================
	public function __construct(){
		if(!is_dir($this->cache_dir)) mkdir($this->cache_dir,0755,true); // 如果目录不存在则创建
	}


	//============================================
	//写入缓存
	//============================================
	function __set($key, $val){
		$this->_set($key, $val);
	}
	//第三个参数为过期时间，传入0则为不过期
	public function _set($key, $val, $limit_time=null)
	{
		$limit_time = $limit_time ? $limit_time : 0; //如果没有出入，则赋值默认缓存时间
		$file = $this->cache_dir.'/'.$key.'.fcache.php';

		$cacheARR = array();
		$cacheARR['fcacheData'] = $val;

		//设置过期时间
		if($limit_time == 0)
		{
			$cacheARR['fcacheLimitTime'] = 0;
		}
		else
		{
			$cacheARR['fcacheLimitTime'] = time()+(int)$limit_time;
		}

		//将要缓存的内容转为可存储的string值
		$cacheARR = serialize($cacheARR);

		//向文件中写入内容
		@file_put_contents($file,$cacheARR) or $this->error('error:fail to write in file.');
		//文件权限
		@chmod($file,0755);
		//修改文件时间
		//@touch($file, time()+$limit_time) or $this->error('error:fail to change time');
	}


	//============================================
	// 读取缓存
	//============================================
	function __get($key)
	{
		return $this->_get($key);
	}
	public function _get($key)
	{
		$file = $this->cache_dir.'/'.$key.'.fcache.php';
		
		if(@filemtime($file)>0) //文件可用
		{
			$fcacheVAL = unserialize(file_get_contents($file)); //把存储的string转为PHP代码
			$fcacheLimitTime = $fcacheVAL['fcacheLimitTime'];
			//unset($fcacheVAL['fcacheLimitTime']);
			//如果过期时间还没到当前时间，则读取
			if($fcacheLimitTime>=time() || $fcacheLimitTime==0)
			{
				return $fcacheVAL['fcacheData']; //返回缓存数据
			}
			else
			{
				@unlink($file); //尝试删除文件
				return ;
			}
		}
		else
		{
			return ; //文件不存在
		}
	}


	//============================================
	// 删除缓存文件
	//============================================
	function __unset($key){
		return $this->_unset($key);
	}
	public function _unset($key){
		$file = $this->cache_dir.'/'.$key.'.fcache.php';

		if(@unlink($file))
		{
			return true;
		}
		else
		{
			return false;
		}
	}


	//============================================
	// 检查缓存文件是否存在，过期视为不存在
	//============================================
	function __isset($key){
		return $this->_isset($key);
	}
	public function _isset($key){
		$file = $this->cache_dir.'/'.$key.'.fcache.php';

		if(@filemtime($file)>0) //文件可用
		{
			$fcacheVAL = unserialize(file_get_contents($file)); //把存储的string转为PHP代码
			$fcacheLimitTime = $fcacheVAL['fcacheLimitTime'];
			//如果过期时间还没到当前时间，则读取
			if($fcacheLimitTime>=time() || $fcacheLimitTime==0)
			{
				return true;
			}
			else
			{
				@unlink($file); //尝试删除文件
				return false;
			}
		}
		else
		{
			return false;
		}
	}


	//============================================
	// 清除过期的缓存文件
	//============================================
	public function clear(){
		$files = scandir($this->cache_dir);

		foreach ($files as $key => $val) {
			$fcacheVAL = unserialize(file_get_contents($val)); //把存储的string转为PHP代码
			$fcacheLimitTime = $fcacheVAL['fcacheLimitTime'];

			//如果过期时间已经过去，则删除
			if($fcacheLimitTime<time())
			{
				@unlink($this->cache_dir."/".$val);
			}
		}
	}


	//============================================
	// 清除所有缓存文件
	//============================================
	public function clearall()
	{
		$files = scandir($this->cache_dir);

        foreach ($files as $val){
			@unlink($this->cache_dir."/".$val); //尝试删除
        }
	}


	//============================================
	public function error($msg)
	{
		die($msg);
	}
}



/****************************************************************
* ValidateForm表单验证类										*
* Website: http://www.magphp.com								*
*****************************************************************
* 常用正则
* preg_match("/^[\x{4e00}-\x{9fa5}]+$/u",$str); //中文汉字
* preg_match("/^[a-z]+$/i", $vfdata); //半角英文字母A-Z，不区分大小写
* preg_match("/^[0-9]+$/i", $vfdata); //半角数字
****************************************************************/
class vf{
	public $errCount = 0; //验证错误统计

	public function __construct(){}

	//索引验证方法
	//一个表单可以进行多种验证，本方法索引传递过来的，调用的验证方法名和参数，进行分别调用验证，返回验证统计结果。
	//$funarr数组参数：fun-验证方法、data-待验证数据、cnname-表单中文名、msg-未通过提示
	//ignore=true时，值为空就不进行验证
	public function v($funarr){
		if(is_array($funarr))
		{
			if(count($funarr)>0)
			{
				$cnname = $funarr['cnname']; //表单控件中文名
				unset($funarr['cnname']); //去掉妨碍循环的数据

				foreach ($funarr as $key => $val)
				{
					//可能不输入值得变量，需要判断，并赋予默认值
					if(!isset($val['msg']))
					{
						$val['msg'] = '';
					}
					if(!isset($val['ignore']))
					{
						$val['ignore'] = false;
					}

					//空验证
					if($val['fun'] == 'kong')
					{
						$retval = $this->kong($cnname,$val['data'],$val['msg']);
						if($retval!='')
						{
							$this->errCount += 1; //错误加1
							return $retval;
							break 1;
						}
					}

					//字符长度
					if($val['fun'] == 'changDu')
					{
						$retval = $this->changDu($cnname,$val['data'],$val['msg'],$val['ifs'],$val['ignore']);
						if($retval!='')
						{
							$this->errCount += 1; //错误加1
							return $retval;
							break 1;
						}
					}

					//数字范围
					if($val['fun'] == 'fanWei')
					{
						$retval = $this->fanWei($cnname,$val['data'],$val['msg'],$val['ifs'],$val['ignore']);
						if($retval!='')
						{
							$this->errCount += 1; //错误加1
							return $retval;
							break 1;
						}
					}

					//两个值是否一致
					if($val['fun'] == 'yiZhi')
					{
						$retval = $this->yiZhi($cnname,$val['data'],$val['msg'],$val['ifs'],$val['ignore']);
						if($retval!='')
						{
							$this->errCount += 1; //错误加1
							return $retval;
							break 1;
						}
					}

					//英文字母
					if($val['fun'] == 'ziMu')
					{
						$retval = $this->ziMu($cnname,$val['data'],$val['msg'],$val['ignore']);
						if($retval!='')
						{
							$this->errCount += 1; //错误加1
							return $retval;
							break 1;
						}
					}

					//数字
					if($val['fun'] == 'shuZi')
					{
						$retval = $this->shuZi($cnname,$val['data'],$val['msg'],$val['ifs'],$val['ignore']);
						if($retval!='')
						{
							$this->errCount += 1; //错误加1
							return $retval;
							break 1;
						}
					}

					//元素成员匹配
					if($val['fun'] == 'chengYuan')
					{
						$retval = $this->chengYuan($cnname,$val['data'],$val['msg'],$val['ifs'],$val['ignore']);
						if($retval!='')
						{
							$this->errCount += 1; //错误加1
							return $retval;
							break 1;
						}
					}

					//批量正则匹配，非验证
					if($val['fun'] == 'zhengzeFie')
					{
						$retval = $this->zhengzeFie($cnname,$val['data'],$val['msg'],$val['ifs'],$val['ignore']);
						if($retval!='')
						{
							$this->errCount += 1; //错误加1
							return $retval;
							break 1;
						}
					}

					//批量正则匹配，是验证
					if($val['fun'] == 'zhengzeShi')
					{
						$retval = $this->zhengzeShi($cnname,$val['data'],$val['msg'],$val['ifs'],$val['ignore']);
						if($retval!='')
						{
							$this->errCount += 1; //错误加1
							return $retval;
							break 1;
						}
					}

					//手机号
					if($val['fun'] == 'shouJi')
					{
						$retval = $this->shouJi($cnname,$val['data'],$val['msg'],$val['ignore']);
						if($retval!='')
						{
							$this->errCount += 1; //错误加1
							return $retval;
							break 1;
						}
					}

					//座机号
					if($val['fun'] == 'zuoJi')
					{
						$retval = $this->zuoJi($cnname,$val['data'],$val['msg'],$val['ignore']);
						if($retval!='')
						{
							$this->errCount += 1; //错误加1
							return $retval;
							break 1;
						}
					}

					//E-Mail电子邮箱
					if($val['fun'] == 'email')
					{
						$retval = $this->email($cnname,$val['data'],$val['msg'],$val['ignore']);
						if($retval!='')
						{
							$this->errCount += 1; //错误加1
							return $retval;
							break 1;
						}
					}

					//URL网址
					if($val['fun'] == 'wangZhi')
					{
						$retval = $this->wangZhi($cnname,$val['data'],$val['msg'],$val['ignore']);
						if($retval!='')
						{
							$this->errCount += 1; //错误加1
							return $retval;
							break 1;
						}
					}

					//邮编
					if($val['fun'] == 'youBian')
					{
						$retval = $this->youBian($cnname,$val['data'],$val['msg'],$val['ignore']);
						if($retval!='')
						{
							$this->errCount += 1; //错误加1
							return $retval;
							break 1;
						}
					}

					//多选
					if($val['fun'] == 'duoXuan')
					{
						$retval = $this->duoXuan($cnname,$val['data'],$val['msg'],$val['ifs'],$val['ignore']);
						if($retval!='')
						{
							$this->errCount += 1; //错误加1
							return $retval;
							break 1;
						}
					}

					//身份证号
					if($val['fun'] == 'shenFenZheng')
					{
						$retval = $this->shenFenZheng($cnname,$val['data'],$val['msg'],$val['ignore']);
						if($retval!='')
						{
							$this->errCount += 1; //错误加1
							return $retval;
							break 1;
						}
					}

					//数据库中已存在相同值数据
					// if($val['fun'] == 'yiCunZai')
					// {
					// 	$retval = $this->yiCunZai($cnname,$val['data'],$val['msg'],$val['ignore']);
					// 	if($retval!='')
					// 	{
					// 		$this->errCount += 1; //错误加1
					// 		return $retval;
					// 		break 1;
					// 	}
					// }

				}
			}
		}
	}


	//===================================================================


	//不得为空
	//vfdata待验证数据
	//vfname输入控件中文名
	//vfmsg提示信息
	public function kong($vfname, $vfdata='', $vfmsg){
		$defmsg = '不得为空'; //默认提示信息
		$msgtxt = $this->msgFun($vfname, $defmsg, $vfmsg); //提示信息加工

		if(trim($vfdata) == '')
		{
			return $msgtxt;
		}
	}

	//字符长度
	//vfifs判断范围
	//ignore=true表示值为空就不进行验证。默认false
	public function changDu($vfname, $vfdata='', $vfmsg, $vfifs, $ignore=false){
		$defmsg = '长度需为'.$vfifs[0].'-'.$vfifs[1].'个字'; //默认提示信息
		$msgtxt = $this->msgFun($vfname, $defmsg, $vfmsg); //提示信息加工

		$vfdata = trim($vfdata); //去掉两端空格

		if($ignore==true && $vfdata=='')
		{
			//开启了空就不验证，且值为空
		}
		else
		{
			if( !(mb_strlen($vfdata,'utf-8')>=$vfifs[0] && mb_strlen($vfdata,'utf-8')<=$vfifs[1]) )
			{
				return $msgtxt;
			}
		}
	}

	//数字范围
	//vfifs[0]第二个数为0，则表示大于0的任何数
	//vfifs[1]=true表示允许有小数，默认为false
	//ignore=true表示值为空就不进行验证。默认false
	public function fanWei($vfname, $vfdata=0, $vfmsg, $vfifs=array(), $ignore=false){
		$defmsg = '数字范围需在'.$vfifs[0][0].'-'.$vfifs[0][1].'之间'; //默认提示信息
		$msgtxt = $this->msgFun($vfname, $defmsg, $vfmsg); //提示信息加工

		//$vfdata = trim($vfdata); //去掉两端空格
		//是否允许小数默认值
		if(!isset($vfifs[1]))
		{
			$vfifs[1] = false; //默认不允许有小数
		}

		if($ignore==true && $vfdata=='')
		{
			//开启了空就不验证，且值为空
		}
		else
		{
			if($vfdata == '')
			{
				return $msgtxt;
			}
			else
			{
				if($vfifs[1]==false && stripos($vfdata,'.')!==false) //如果不允许小数，且值=小数
				{
					$defmsg = '数字不允许是小数'; //默认提示信息
					$msgtxt = $vfname.$defmsg;

					return $msgtxt;
				}

				if($vfifs[0][1]==0)
				{
					$defmsg = '数字范围需大于'.$vfifs[0][0]; //默认提示信息
					$msgtxt = $this->msgFun($vfname, $defmsg, $vfmsg); //提示信息加工

					if( !($vfdata>=$vfifs[0][0]) )
					{
						return $msgtxt;
					}
				}
				else
				{
					if( !($vfdata>=$vfifs[0][0] && $vfdata<=$vfifs[0][1]) )
					{
						return $msgtxt;
					}
				}
			}
		}
	}

	//两个值是否一致
	//vfdata[0]第一个值，vfdata[1]第二个值
	//vfifs=true大小写不明感（转为小写），默认false
	//ignore=true表示值为空就不进行验证。默认false
	public function yiZhi($vfname, $vfdata=array(), $vfmsg, $vfifs=false, $ignore=false){
		$defmsg = '两项不一致'; //默认提示信息
		$msgtxt = $this->msgFun($vfname, $defmsg, $vfmsg); //提示信息加工

		if(is_array($vfdata))
		{
			if($vfifs)
			{
				$vfdata[0] = strtolower($vfdata[0]);
				$vfdata[1] = strtolower($vfdata[1]);
			}
			if($ignore==true && $vfdata[0]=='' && $vfdata[1]=='')
			{
				//开启了空就不验证，且值为空
			}
			else
			{
				if($vfdata[0]!=$vfdata[1])
				{
					return $msgtxt;
				}
			}
		}
	}

	//是否为英文字母
	public function ziMu($vfname, $vfdata='', $vfmsg, $ignore=false){
		$defmsg = '需为英文字母A-Z和英文空格，且不区分大小写'; //默认提示信息
		$msgtxt = $this->msgFun($vfname, $defmsg, $vfmsg); //提示信息加工
		
		$vfdata = trim($vfdata); //去掉两端空格

		if($ignore==true && $vfdata=='')
		{
			//开启了空就不验证，且值为空
		}
		else
		{
			$findCount = preg_match("/^[a-z ]+$/i", $vfdata); //正则匹配，不区分大小写
			if($findCount == 0)
			{
				return $msgtxt;
			}
		}
	}

	//是否为数字
	//vfifs[0]=0为整数判断 ， vfifs[0]=大于0(1/2/3...)为这么多位的小数判断
	//vfifs[1]=true允许负数，默认vfifs[1]=false
	public function shuZi($vfname, $vfdata=0, $vfmsg, $vfifs=array(), $ignore=false){
		$defmsg = '需为正的整数'; //默认提示信息
		$msgtxt = $this->msgFun($vfname, $defmsg, $vfmsg); //提示信息加工
		
		//$vfdata = trim($vfdata); //去掉两端空格

		if($ignore==true && $vfdata=='')
		{
			//开启了空就不验证，且值为空
		}
		else
		{
			//设置默认值
			if(count($vfifs)<2)
			{
				$vfifs[0] = 0; //小数位
				$vfifs[1] = false; //是否允许负数
			}

			if($vfifs[0]>0)
			{
				//小数
				if($vfifs[1])
				{
					$defmsg = '需为'.$vfifs[0].'位小数内的正负均可的小数'; //默认提示信息
					$msgtxt = $this->msgFun($vfname, $defmsg, $vfmsg); //提示信息加工
					//正小数+负小数
					$findCount = preg_match("/^(-[\d]+(.[\d]{".$vfifs[0]."}+)?)|([\d]+(.[\d]{0,".$vfifs[0]."}+)?$/", $vfdata); //正则匹配
				}
				else
				{
					$defmsg = '需为'.$vfifs[0].'位小数内的正的小数'; //默认提示信息
					$msgtxt = $this->msgFun($vfname, $defmsg, $vfmsg); //提示信息加工
					//正小数
					$findCount = preg_match("/^[\d]+(.[\d]{0,".$vfifs[0]."}+)?$/", $vfdata); //正则匹配
				}

				if($findCount == 0)
				{
					return $msgtxt;
				}
			}
			else
			{
				//整数
				if($vfifs[1])
				{
					$defmsg = '需为正负均可的整数'; //默认提示信息
					$msgtxt = $this->msgFun($vfname, $defmsg, $vfmsg); //提示信息加工
					//正整数+负整数
					$findCount = preg_match("/^(-[1-9]+)|([\d]+)$/", $vfdata); //正则匹配
				}
				else
				{
					//msgtxt为默认值
					//正整数
					$findCount = preg_match("/^[\d]+$/", $vfdata); //正则匹配
				}

				if($findCount == 0)
				{
					return $msgtxt;
				}
			}
		}
	}

	//是否为自定义元素成员
	//vfifs为元素成员数组
	public function chengYuan($vfname, $vfdata='', $vfmsg, $vfifs=array(), $ignore=false){
		$defmsg = '存在不允许的内容'; //默认提示信息
		$msgtxt = $this->msgFun($vfname, $defmsg, $vfmsg); //提示信息加工

		$vfdata = (string)trim($vfdata); //去掉两端空格

		if($ignore==true && $vfdata=='')
		{
			//开启了空就不验证，且值为空
		}
		else
		{
			$strARR = str_split($vfdata);
			foreach ($strARR as $key => $val) {
				if(array_search($val, $vfifs) === false)
				{
					//值中的字母，在元素成员中没找到
					return $msgtxt;
				}
			}
		}
	}

	//正则匹配，非验证
	//vfifs数组，多个正则表达式，将循环匹配每条规则
	//只要匹配到一条，就报错（一般用作验证是否存在“不允许”输入内容）
	public function zhengzeFie($vfname, $vfdata='', $vfmsg, $vfifs=array(), $ignore=false){
		$defmsg = '存在不允许的内容'; //默认提示信息
		$msgtxt = $this->msgFun($vfname, $defmsg, $vfmsg); //提示信息加工

		$vfdata = (string)trim($vfdata); //去掉两端空格

		if($ignore==true && $vfdata=='')
		{
			//开启了空就不验证，且值为空
		}
		else
		{
			foreach ($vfifs as $key => $val){
				if (preg_match($val,$vfdata) > 0)
				{
					//匹配到了
					return $msgtxt;
				}
			}
		}
	}

	//正则匹配，是验证
	//vfifs数组，多个正则表达式，将循环匹配每条规则
	//所有规则都没匹配到，才报错（一般用作验证是否存在“允许”输入的内容）
	public function zhengzeShi($vfname, $vfdata='', $vfmsg, $vfifs=array(), $ignore=false){
		$defmsg = '请输入指定范围的内容'; //默认提示信息
		$msgtxt = $this->msgFun($vfname, $defmsg, $vfmsg); //提示信息加工

		$vfdata = (string)trim($vfdata); //去掉两端空格
		$noFindNum = 0; //没匹配到统计

		if($ignore==true && $vfdata=='')
		{
			//开启了空就不验证，且值为空
		}
		else
		{
			foreach ($vfifs as $key => $val){
				if (preg_match($val,$vfdata) == 0)
				{
					//没找到
					$noFindNum += 1;
				}
			}
		}
		//如果所有规则都没匹配到
		if($noFindNum == count($vfifs))
		{
			return $msgtxt;
		}
	}

	//手机号
	public function shouJi($vfname, $vfdata='', $vfmsg, $ignore=false)
	{
		$defmsg = '需为11位手机号码格式（例:13866668888）'; //默认提示信息
		$msgtxt = $this->msgFun($vfname, $defmsg, $vfmsg); //提示信息加工

		$vfdata = (string)trim($vfdata); //去掉两端空格

		if($ignore==true && $vfdata=='')
		{
			//开启了空就不验证，且值为空
		}
		else
		{
			$findCount = preg_match("/^1[0-9][0-9]\d{8}$/", $vfdata); //正则匹配
			if($findCount == 0)
			{
				return $msgtxt;
			}
		}
	}

	//座机 【兼容格式: 区号(3到4位)-电话号码(7到8位)-分机号(1到6位)】
	public function zuoJi($vfname, $vfdata='', $vfmsg, $ignore=false)
	{
		$defmsg = '需为座机号码格式（例:010-666688888）'; //默认提示信息
		$msgtxt = $this->msgFun($vfname, $defmsg, $vfmsg); //提示信息加工

		$vfdata = (string)trim($vfdata); //去掉两端空格

		if($ignore==true && $vfdata=='')
		{
			//开启了空就不验证，且值为空
		}
		else
		{
			$findCount = preg_match("/^(([0+]\d{2,3})-)?(\d{7,8})(-\d{1,6})?$/", $vfdata); //正则匹配
			if($findCount == 0)
			{
				return $msgtxt;
			}
		}
	}

	//邮箱
	public function email($vfname, $vfdata='', $vfmsg, $ignore=false)
	{
		$defmsg = '需为E-Mail电子邮箱格式（例:myname@163.com）'; //默认提示信息
		$msgtxt = $this->msgFun($vfname, $defmsg, $vfmsg); //提示信息加工

		$vfdata = (string)trim($vfdata); //去掉两端空格

		if($ignore==true && $vfdata=='')
		{
			//开启了空就不验证，且值为空
		}
		else
		{
			$findCount = preg_match("/^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/", $vfdata); //正则匹配
			if($findCount == 0)
			{
				return $msgtxt;
			}
		}
	}

	//网址
	public function wangZhi($vfname, $vfdata='', $vfmsg, $ignore=false)
	{
		$defmsg = '需为网址格式（例:www.net.cn或www.net.cn/myurl.html以此类推）'; //默认提示信息
		$msgtxt = $this->msgFun($vfname, $defmsg, $vfmsg); //提示信息加工

		$vfdata = (string)trim($vfdata); //去掉两端空格

		if($ignore==true && $vfdata=='')
		{
			//开启了空就不验证，且值为空
		}
		else
		{
			$findCount = preg_match("/^(\w+:\/\/)?\w+(\.\w+)+.*$/", $vfdata); //正则匹配
			if($findCount == 0)
			{
				return $msgtxt;
			}
		}
	}

	//邮编
	public function youBian($vfname, $vfdata='', $vfmsg, $ignore=false)
	{
		$defmsg = '需为6位邮政编码格式（例:100061）'; //默认提示信息
		$msgtxt = $this->msgFun($vfname, $defmsg, $vfmsg); //提示信息加工

		$vfdata = (string)trim($vfdata); //去掉两端空格

		if($ignore==true && $vfdata=='')
		{
			//开启了空就不验证，且值为空
		}
		else
		{
			$findCount = preg_match("/^[0-9]{6}$/", $vfdata); //正则匹配
			if($findCount == 0)
			{
				return $msgtxt;
			}
		}
	}

	//多选
	//vfdata值数组集合
	//vfifs至少选择几个选项
	public function duoXuan($vfname, $vfdata=array(), $vfmsg, $vfifs=0, $ignore=false)
	{
		$defmsg = '需至少选择'.$vfifs.'项'; //默认提示信息
		$msgtxt = $this->msgFun($vfname, $defmsg, $vfmsg); //提示信息加工

		if($ignore==true && $vfdata=='')
		{
			//开启了空就不验证，且值为空
		}
		else
		{
			if(count($vfdata) < $vfifs)
			{
				return $msgtxt;
			}
		}
	}

	//数据库中已存在相同值数据
	//$vfdata[0] 待验证值
	//$vfdata[1] 数据库表名
	//$vfdata[2] 数据库字段名
	public function yiCunZai($vfname, $vfdata=array(), $vfmsg, $ignore=false)
	{
		$defmsg = '已存在此'.$vfname.''; //默认提示信息
		$msgtxt = $this->msgFun($vfname, $defmsg, $vfmsg); //提示信息加工

		if($ignore==true && $vfdata=='')
		{
			//开启了空就不验证，且值为空
		}
		else
		{
			if(count($vfdata)>0)
			{
				// include('./Lib/config.php'); //引入数据库配置
				// include('./sys/medoo.php'); //引入数据库驱动
				// var_dump($configdata['DB']);
				// die();
				//$db = new medoo($configdata['DB']);

				//$findCount = $db->count($vfdata[1],[ $vfdata[2]=>$vfdata[0] ]);
				if($findCount>0)
				{
					return $msgtxt;
				}
			}
		}
	}

	//身份证
	function shenFenZheng($vfname, $vfdata='', $vfmsg, $ignore=false)
	{
		$defmsg = '请输入正确的身份证号（例:34122519670109819X'; //默认提示信息
		$msgtxt = $this->msgFun($vfname, $defmsg, $vfmsg); //提示信息加工

		if($ignore==true && $vfdata=='')
		{
			//开启了空就不验证，且值为空
		}
		else
		{
		    // 只能是18位
		    if(strlen($vfdata)!=18)
		    {
		        return $defmsg;
		    }
		    // 取出本体码
		    $idcard_base = substr($vfdata, 0, 17);
		    // 取出校验码
		    $verify_code = substr($vfdata, 17, 1);
		    // 加权因子
		    $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
		    // 校验码对应值
		    $verify_code_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
		    // 根据前17位计算校验码
		    $total = 0;
		    for($i=0; $i<17; $i++)
		    {
		        $total += substr($idcard_base, $i, 1)*$factor[$i];
		    }
		    // 取模
		    $mod = $total % 11;
		    // 比较校验码
		    if( !($verify_code == $verify_code_list[$mod]) )
		    {
		    	return $msgtxt;
		        //return false;
		    }
		}
	}


	//单选
	//下拉菜单
	//多选菜单

	//===================================================================

	//提示信息加工
	//如果vfmsg有内容，则显示vfmsg的内容
	//如果vfname有内容，则提示vfname名称+提示内容
	public function msgFun($vfname='', $defmsg='', $vfmsg='')
	{
		if(trim($vfmsg) != '')
		{
			$defmsg = $vfmsg;
		}
		if(trim($vfname) != '')
		{
			$defmsg = $vfname.$defmsg;
		}
		return $defmsg;
	}
}



/****************************************************************
* ValidateCode图形验证码类										*
* Website: http://www.magphp.com								*
*****************************************************************/
class vc {
    private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789';    //随机因子
    private $code;                            //验证码
    public $codelen = 4;                    //验证码长度
    public $width = 130;                    //宽度
    public $height = 50;                    //高度
    private $img;                                //图形资源句柄
    private $font;                                //指定的字体
    public $fontsize = 20;                //指定字体大小
    private $fontcolor;                        //指定字体颜色

    //构造方法初始化
    public function __construct() {
        $this->font = SYSDIR.'/sys/elephant.ttf'; //字体文件位置**************************
    }

    //生成随机码
    private function createCode() {
        $_len = strlen($this->charset)-1;
        for ($i=0;$i<$this->codelen;$i++) {
            $this->code .= $this->charset[mt_rand(0,$_len)];
        }
    }

    //生成背景
    private function createBg() {
        $this->img = imagecreatetruecolor($this->width, $this->height);
        $color = imagecolorallocate($this->img, mt_rand(157,255), mt_rand(157,255), mt_rand(157,255));
        imagefilledrectangle($this->img,0,$this->height,$this->width,0,$color);
    }

    //生成文字
    private function createFont() {    
        $_x = $this->width / $this->codelen;
        for ($i=0;$i<$this->codelen;$i++) {
            $this->fontcolor = imagecolorallocate($this->img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156));
            imagettftext($this->img,$this->fontsize,mt_rand(-30,30),$_x*$i+mt_rand(1,5),$this->height / 1.4,$this->fontcolor,$this->font,$this->code[$i]);
        }
    }

    //生成线条、雪花
    private function createLine() {
        for ($i=0;$i<6;$i++) {
            $color = imagecolorallocate($this->img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156));
            imageline($this->img,mt_rand(0,$this->width),mt_rand(0,$this->height),mt_rand(0,$this->width),mt_rand(0,$this->height),$color);
        }
        for ($i=0;$i<100;$i++) {
            $color = imagecolorallocate($this->img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));
            imagestring($this->img,mt_rand(1,5),mt_rand(0,$this->width),mt_rand(0,$this->height),'*',$color);
        }
    }

    //输出
    private function outPut() {
        header('Content-type:image/png');
        imagepng($this->img);
        imagedestroy($this->img);
    }

    //对外生成
    public function doimg() {
        $this->createBg();
        $this->createCode();
        $this->createLine();
        $this->createFont();
        $this->outPut();
    }

    //获取验证码
    public function getCode() {
        return strtolower($this->code);
    }
}

//vc类的简化实现类（语法糖）
class getvc{
	public static function img($width=100, $height=42, $fontsize=18, $codelen=4, $sessionname=null) {
		if(!isset($sessionname))
		{
			$sessionname = 'vfcode';
		}

		SESSION($sessionname,null);

		$_vc = new vc(); //实例化一个对象

		$_vc->codelen = $codelen; //字符数
		$_vc->width = $width; //宽度
		$_vc->height = $height; //高度
		$_vc->fontsize = $fontsize; //字大小

		$_vc->doimg();
		SESSION($sessionname, $_vc->getCode());//验证码保存到SESSION中
	}
}

